//
//  Element3D.cpp
//  C3W_Demo_By_Fan
//
//  Created by 范静涛 on 2024/7/23.
//

//------------------------------------------------------------------------------
//【文件名】Element3D.cpp
//【功能模块和目的】三维基元类(若干非重复三维点构成)实现
//【开发者及日期】范静涛 2024/7/23
//【更改记录】
//------------------------------------------------------------------------------

//自身类头文件
#include "Element3D.hpp"
//size_t所属头文件
#include <cstddef>
//std::string字符串类所属头文件
#include <string>
//std异常基类所属头文件
#include <stdexcept>

//------------------------------------------------------------------------------
//必要的构造、析构、赋值行为
//------------------------------------------------------------------------------

//函数名：Element3D
//功能：默认构造函数，初始化最多容纳MaxPointCount个三维点的基元
//入口参数：size_t MaxPointCount
//出口参数：无
//返回值：无
Element3D::Element3D(size_t MaxPointCount) : m_Points(MaxPointCount){
}
//------------------------------------------------------------------------------

//函数名：Element3D
//功能：带参构造函数，初始化最多容纳Point3DSet::MAX_COUNT个三维点的基元
//     并实际存储Source中的非重复三维点
//入口参数：const std::vector<Point3D>& Source
//出口参数：无
//返回值：无
Element3D::Element3D(const std::vector<Point3D>& Source) : m_Points{Source} {
}
//------------------------------------------------------------------------------

//函数名：Element3D
//功能：拷贝构造函数，初始化最多容纳Point3DSet::MAX_COUNT个三维点的基元
//     并实际存储Source.Points中的三维点
//入口参数：const Element3D& Source
//出口参数：无
//返回值：无
Element3D::Element3D(const Element3D& Source) : m_Points(Source.Points){
}
//------------------------------------------------------------------------------


//函数名：operator=
//功能：赋值运算符overload
//入口参数：const Element3D& Source
//出口参数：无
//返回值：基元自身的引用
Element3D& Element3D::operator=(const Element3D& Source){
    if (this != &Source) {
        m_Points = Source.m_Points;
    }
    return *this;
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//非静态Setter成员函数
//------------------------------------------------------------------------------

//函数名：AppendPoint
//功能：添加一个不重复三维点，调用AppendPointByRule实现
//入口参数：const Point3D& APoint
//出口参数：无
//返回值：无
void Element3D::AppendPoint(const Point3D& APoint){
    AppendPointByRule(APoint);
}
//------------------------------------------------------------------------------

//函数名：ModifyPoint
//功能：修改一个已存在三维点坐标为非重复三维点，调用ModifyPointByRule实现
//入口参数：const Point3D& From, const Point3D& To
//出口参数：无
//返回值：无
void Element3D::ModifyPoint(const Point3D& From, const Point3D& To){
    ModifyPointByRule(From, To);
}
//------------------------------------------------------------------------------

//函数名：RemovePoint
//功能：删除一个已存在三维点，调用RemovePoint实现
//入口参数：const Point3D& APoint
//出口参数：无
//返回值：无
void Element3D::RemovePoint(const Point3D& APoint){
    RemovePointByRule(APoint);
}
//------------------------------------------------------------------------------

//函数名：Clear
//功能：清空三维点，调用ClearByRule实现
//入口参数：无
//出口参数：无
//返回值：无
void Element3D::Clear(){
    ClearByRule();
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//非静态Getter成员函数：需检查所有Getter是否有后置const
//------------------------------------------------------------------------------

//函数名：operator<<
//功能：流插入运算符friend overload
//入口参数：std::ostream& Stream, const Element3D& AnElement
//出口参数：std::ostream& Stream
//返回值：插入后的流自身的引用
std::ostream& operator<<(std::ostream& Stream, const Element3D& AnElement){
    //逐一插入三维点，每个后接一个空格
    for (size_t i = 0; i < AnElement.PointCount - 1; i++){
        Stream << AnElement.Points[i] << ' ';
    }
    //最后一个没空格
    Stream << AnElement.Points[AnElement.PointCount - 1];
    return Stream;
}
//------------------------------------------------------------------------------

//函数名：operator==
//功能：判断基元相等
//入口参数：const Element3D& AnElement
//出口参数：无
//返回值：三维点集合相同返回true，否则返回false
bool Element3D::operator==(const Element3D& AnElement) const{
    return Points == AnElement.Points;
}

//函数名：operator!=
//功能：判断基元不等
//入口参数：const Element3D& AnElement
//出口参数：无
//返回值：三维点集合不同返回true，否则返回false
bool Element3D::operator!=(const Element3D& AnElement) const{
    return !(*this == AnElement);
}

//--------------------------------------------------------------------------
//受保护 非静态Setter成员函数
//--------------------------------------------------------------------------

//函数名：AppendPointByRule
//功能：根据规则添加三维点，派生类可overload。本类实现为直接添加
//     添加已有三维点，则Point3DSet类抛出异常
//入口参数：const Point3D& APoint
//出口参数：无
//返回值：无
void Element3D::AppendPointByRule(const Point3D& APoint){
    m_Points.Append(APoint);
}
//------------------------------------------------------------------------------

//函数名：ModifyPointByRule
//功能：根据规则修改三维点，派生类可overload。本类实现为直接修改
//     From不存在或To已存在，则Point3DSet类抛出异常
//入口参数：const Point3D& APoint
//出口参数：无
//返回值：无
void Element3D::ModifyPointByRule(const Point3D& From, const Point3D& To){
    m_Points.Modify(From, To);
}
//------------------------------------------------------------------------------

//函数名：RemovePointByRule
//功能：根据规则删除三维点，派生类可overload。本类实现为直接删除
//     删除不存在的三维点，则Point3DSet类抛出异常
//入口参数：const Point3D& APoint
//出口参数：无
//返回值：无
void Element3D::RemovePointByRule(const Point3D& APoint){
    m_Points.Remove(APoint);
}
//------------------------------------------------------------------------------

//函数名：ClearByRule
//功能：根据规则清空三维点，派生类可overload。本类实现为直接清空
//入口参数：无
//出口参数：无
//返回值：无
void Element3D::ClearByRule(){
    return m_Points.Clear();
}
//------------------------------------------------------------------------------

